import html.ParseErrors;
import html.elements.Node;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class HtmlVerify
{
	public static void Verify(String htmlText,ParseErrors errors)
	{
		int i,j;
		htmlText = htmlText.replace("\u00A0", "");
		htmlText = htmlText.replace("\u2007", "");
		htmlText = htmlText.replace("\u202F", "");
		htmlText = htmlText.replace("\b", "");
		htmlText = htmlText.replace("\t", "");
		htmlText = htmlText.replace("\n", "");
		htmlText = htmlText.replace("\u000B", "");
		htmlText = htmlText.replace("\f", "");
		htmlText = htmlText.replace("\r", "");
		htmlText = htmlText.replace("\u001C", "");
		htmlText = htmlText.replace("\u001D", "");
		htmlText = htmlText.replace("\u001E", "");
		htmlText = htmlText.replace("\u001F", "");
//		htmlText = htmlText.replaceAll(" +", " ");

		/*htmlText = htmlText.replace('\u00A0', ' ');
		htmlText = htmlText.replace('\u2007', ' ');
		htmlText = htmlText.replace('\u202F', ' ');
		htmlText = htmlText.replace('\b', ' ');
		htmlText = htmlText.replace('\t', ' ');
		htmlText = htmlText.replace('\n', ' ');
		htmlText = htmlText.replace('\u000B', ' ');
		htmlText = htmlText.replace('\f', ' ');
		htmlText = htmlText.replace('\r', ' ');
		htmlText = htmlText.replace('\u001C', ' ');
		htmlText = htmlText.replace('\u001D', ' ');
		htmlText = htmlText.replace('\u001E', ' ');
		htmlText = htmlText.replace('\u001F', ' ');
		htmlText = htmlText.replaceAll(" +", " ");*/

		while((i=htmlText.indexOf("<!--"))>=0)
		{
			j=htmlText.indexOf("-->",i);
			if(j<0)
			{
				errors.add("Нет закрывающего тега '-->' у комментария");
				j=htmlText.length();
			}
			else
				j+=("-->").length();
//			System.out.println(htmlText.substring(i,j));
			htmlText=htmlText.replace(htmlText.substring(i,j),"");
		}


		//System.out.println("!!!"+htmlText+"!!!");
		List<Point> tagPos = new ArrayList<Point>();
		boolean atrText = false;
		char atrtTextStartChar = ' ';
		for (i = 0; i < htmlText.length(); i++)
		{
			if (atrText)
			{
				if (htmlText.charAt(i) == atrtTextStartChar)
					atrText=false;
				else if(htmlText.charAt(i) == '\\')
					i++;
			}
			else
			{
				if (htmlText.charAt(i) == '<' &&
						i + 1 < htmlText.length() &&
						(Character.isLetter(htmlText.charAt(i + 1)) || htmlText.charAt(i + 1)=='!' || htmlText.charAt(i + 1)=='/') &&
						(tagPos.size() == 0 ||
								(tagPos.get(tagPos.size() - 1).x != -1 &&
										tagPos.get(tagPos.size() - 1).y != -1)))
					tagPos.add(new Point(i+1, -1));
				else if (htmlText.charAt(i) == '>' &&
						tagPos.size() > 0 &&
						tagPos.get(tagPos.size() - 1).x != -1 &&
						tagPos.get(tagPos.size() - 1).y == -1
						)
					tagPos.get(tagPos.size() - 1).y = i;
				else if (htmlText.charAt(i) == '"' || htmlText.charAt(i) == '\'')
				{
					atrText = true;
					atrtTextStartChar = htmlText.charAt(i);
				}
			}
		}

		for(i=0;i<tagPos.size();i++)
		{
			Node.getInstance(
					htmlText.substring(tagPos.get(i).x, tagPos.get(i).y),
					(i+1<tagPos.size())? htmlText.substring(tagPos.get(i).y+1, tagPos.get(i+1).x-1):"",
					errors);
		}
	}
}
